GitHub Actions を利用して AWS SAM のデプロイ環境をセットアップしてみた

GitHub Actions を利用して AWS SAM のデプロイ環境をセットアップしてみた

Clock Icon2025.01.19

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

最近、 AWS SAM を複数人開発で利用するケースに遭遇し、将来的に CI/CD が必要になりそうな予感がしています。

そこで今回は以下の構成のように、 GitHub Actions を利用して AWS へのデプロイ環境を構築してみたいと思います。

GitHub と AWS 間の認証認可

GitHub と AWS の間の認証認可を設定します。以下を実施します。

https://docs.github.com/ja/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

ID プロバイダの作成

GitHub との連携用に OpenID Connect を利用した IAM ロールの作成を行います。

IAM コンソールから ID プロバイダをクリックします。

2025-01-18 at 23.08.12-ダッシュボード  IAM  Global.png

ID プロバイダの作成をクリックし、プロバイダの URL と対象者を入力します。

  • プロバイダの URL:https://token.actions.githubusercontent.com
  • 対象者:sts.amazonaws.com

2025-01-18 at 23.11.10-ID プロバイダを作成  IAM  Global.png

作成されたら ID プロバイダの ARN をメモしておきます。

2025-01-18 at 23.16.44-token.actions.githubusercontent.com  IAM  Global.png

IAM ロールの作成

続いて IAM ロールを作成してきます。

信頼ポリシーはカスタムを選択し、プロバイダの ARN は先ほどメモしておいた ARN、 "token.actions.githubusercontent.com:sub" は紐付けしたいリポジトリを指定します。

(私の場合だと hogehoge-org の hogehoge-repo の任意のブランチからデプロイできるようにしています。)

assume_role.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:hogehoge-org/hogehoge-repo:*"
        },
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

権限に関しては現時点では絞れなさそうなので AdministratorAccess 権限としました。

2025-01-18 at 23.28.58-ロールを作成  IAM  Global.png

ワークフローの作成

GitHub 側のワークフローに移ります。今回は次のファイルを作成しました。

.github/workflows/deploy.yaml
name: Deploy-AWS-SAM-Application

on:
  push:
    branches:
      - 'develop'

env:
  TEMPLATE_FILE: template.yaml
  SAM_CLI_TELEMETRY: 0

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-22.04
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
        with:
          use-installer: true
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
          aws-region: ap-northeast-1
          role-session-name: SamDeploy
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset

起点ブランチ

develop ブランチを起点に、ワークフローが動く仕組みになっています。

必要に応じて適宜、ブランチ別で環境を用意しても良いかもですね。

ひとまずテスト段階。最終的にはエイリアスを利用して環境まとめたいので develop ブランチのみでスタートしてみました。

.github/workflows/deploy.yaml
name: Deploy-AWS-SAM-Application

+ on:
+   push:
+     branches:
+       - 'develop'

env:
  TEMPLATE_FILE: template.yaml
  SAM_CLI_TELEMETRY: 0

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-22.04
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
        with:
          use-installer: true
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
          aws-region: ap-northeast-1
          role-session-name: SamDeploy
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset

permissions

permissions は以下の通り、 id-token: writecontents: read を付与しました。

ジョブまたはワークフローの実行には、GitHub の OIDC プロバイダーが実行ごとに JSON Web Token を作成できるようにするために、id-token: write を含む permissions 設定が必要です。 id-token の permissions が write に設定されていない場合、OIDC JWT ID トークンを要求することはできません。ただし、この値はリソースへの書き込みアクセスを許可することを意味せず、アクションまたはステップの OIDC トークンをフェッチして設定し、有効期間の短いアクセス トークンを使用して認証を有効にできるだけです。 実際の信頼の設定は OIDC 要求を使用して定義されます。詳細については、「OpenID Connect を使ったセキュリティ強化について」を参照してください。

https://docs.github.com/ja/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#github-actions-ワークフローを更新する

.github/workflows/deploy.yaml
name: Deploy-AWS-SAM-Application

on:
  push:
    branches:
      - 'develop'

env:
  TEMPLATE_FILE: template.yaml
  SAM_CLI_TELEMETRY: 0

permissions:
+ id-token: write
+ contents: read

jobs:
  deploy:
    runs-on: ubuntu-22.04
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
        with:
          use-installer: true
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
          aws-region: ap-northeast-1
          role-session-name: SamDeploy
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset

Assume 先の権限

以下のドキュメントだと、aws-actions/configure-aws-credentials が古いものとなっており、アクセスキーを利用するパターンとなっていました。

on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-2
      - run: sam build --use-container
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/deploying-using-github.html

aws-actions/configure-aws-credentials@v4 の場合、先ほど作成した IAM ロールを利用できるためこちらのバージョンアップを行いました。

.github/workflows/deploy.yaml
name: Deploy-AWS-SAM-Application

on:
  push:
    branches:
      - 'develop'

env:
  TEMPLATE_FILE: template.yaml
  SAM_CLI_TELEMETRY: 0

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-22.04
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
        with:
          use-installer: true
-     - uses: aws-actions/configure-aws-credentials@v1
-       with:
-         aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
-         aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
-         aws-region: us-east-2
+     - uses: aws-actions/configure-aws-credentials@v4
+       with:
+         role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
+         aws-region: ap-northeast-1
+         role-session-name: SamDeploy
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset

SAM Setup

以下のブログのように素の aws-actions/setup-sam を利用するとビルドに時間がかかるため、 use-installer: true を利用して短縮を行いました。(ありがたいですね)

actions/setup-python@v3 は Python ランタイムの Lambda を利用するため継続利用しました。

https://zenn.dev/miztch/articles/setup-sam-use-installer

.github/workflows/deploy.yaml
name: Deploy-AWS-SAM-Application

on:
  push:
    branches:
      - 'develop'

env:
  TEMPLATE_FILE: template.yaml
  SAM_CLI_TELEMETRY: 0

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-22.04
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
+       with:
+         use-installer: true
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
          aws-region: ap-northeast-1
          role-session-name: SamDeploy
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset

ビルド/デプロイの時間は、使っているリソースによって左右するため、今回は触れませんが、ビルド/デプロイまでの初期セットアップは非常に高速に準備できていますね。

2025-01-19 at 01.12.02-Merge pull request #8 from classmethod-awsfeatureactions_mentenance · classmethod-awscm-finops-booster@3d48989.png

まとめ

以上、「GitHub Actions を利用して AWS SAM のデプロイ環境をセットアップしてみた」でした。

aws-actions がかなり充実しており、コード量が非常に少なく便利ですね。

おもしろい aws-actions がないか調べてみたくなりました。このブログが参考になれば幸いです。

クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.